\documentclass[a4paper,12pt]{article}
\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage[pdftex]{graphicx}
\usepackage{float}
\usepackage[usenames,dvipsnames]{color}
\usepackage{colortbl} 
\usepackage{xcolor} 
\usepackage{comment}
\usepackage{pdflscape}
\usepackage{pdfpages}
\graphicspath{ {SequenceDiagrams/}{./} {Mockups/} {StatechartDiagrams/}{Alloy/} {Alloy/Mondi/} }
\newcommand{\HRule}{\rule{\linewidth}{0.5mm}}
\title{Documento di analisi e specifica dei requisiti\\TravelDream}
\author{Jacopo Fiorenza\\
Alessandro Guagnelli\\
Filippo Garolla}
\date{11 Novembre 2013}

\begin{document}
\input{./titlepage.tex}
\setcounter{secnumdepth}{5}
\setcounter{tocdepth}{5}
\tableofcontents
\newpage
\section{Introduzione}

\subsection{Obiettivo del documento}
Il presente documento si propone di illustrare tutti i requisiti funzionali e non funzionali del progetto TravelDream, le specifiche ed i modelli risultanti dall'analisi dell'ambiente.

Il presente documento è rivolto a tutti gli stakeholders del progetto:
\begin{itemize}
\item I committenti, identificati nelle figure del docente di Ingegneria del Software 2 e dei suoi assistenti;
\item Il team di progetto e sviluppo (Jacopo Fiorenza, Filippo Garolla e Alessandro Guagnelli), che avrà modo tramite questo documento di tenere traccia delle funzionalità che sono già state sviluppate e di quali sono ancora da sviluppare, potendo così suddividersi in maniera efficiente ed efficace tra i vari compiti.
\item Il team di test, che sarà deciso dai committenti del progetto una volta completata l'implementazione.
\end{itemize}
\subsection{Finalità e obiettivi del progetto}
Il sistema richiesto è un sistema informativo basato sul web pensato per la vendita di pacchetti viaggio creati dagli impiegati dell'agenzia a partire da prodotti base. Il cliente potrà esplorare i pacchetti preconfigurati che vengono proposti dall'agenzia, personalizzarli in base alle proprie esigenze e acquistarli. Il cliente potrà inoltre condividere tramite un codice identificativo i pacchetti con i propri amici, che potranno decidere di acquistare lo stesso pacchetto.

Il sistema andrà ad inserirsi nella sezione vendite dell'azienda committente fornendo un nuovo canale di vendita.\\\\Gli obiettivi principali del progetto (Goal) con le rispettive priorità sono i seguenti:
\begin{itemize}
\item G1 (Priorità alta): Consentire ad un impiegato la gestione dei prodotti base e dei pacchetti viaggio
\item G2 (Priorità alta): Consentire ad un cliente di ricercare, personalizzare ed acquistare un pacchetto viaggio 
\item G3 (Priorità media): Consentire ad un cliente di suggerire un pacchetto viaggio acquistato ai suoi amici
\item G4 (Priorità media): Consentire agli amici di visualizzare ed acquistare i pacchetti che gli sono stati suggeriti
\item G5 (Priorità bassa): Consentire al cliente di aggiungere prodotti base opzionali ad una gift list collegata ad un pacchetto di viaggio già acquistato
\item G6 (Priorità bassa): Consentire agli amici di acquistare prodotti base nella gift list di un pacchetto di cui hanno ricevuto il codice identificativo dopo essersi registrati come clienti
\end{itemize}
\subsubsection{Funzionalità generali del prodotto software}
In seguito ad un'analisi degli obiettivi e delle finalità del progetto, sono emerse le seguenti funzionalità generali che dovranno essere implementate:
\begin{itemize}
\item MF1: La gestione dei prodotti base da parte dell'impiegato
\item MF2: La gestione della registrazione degli utenti e della modifica dei loro dati anagrafici
\item MF3: La creazione di pacchetti preconfigurati partendo da prodotti base da parte dell'impiegato
\item MF4: La ricerca di pacchetti preconfigurati in base alla data del viaggio, alla sua destinazione o ad entrambi i criteri
\item MF5: La personalizzazione di un pacchetto preconfigurato
\item MF6: La creazione di una gift list per un determinato pacchetto acquistato
\end{itemize}
\subsubsection{Limitazioni del prodotto software}
In questo paragrafo si vogliono elencare tutte quelle funzionalità che il progetto software da sviluppare non prevede, ma che potrebbero essere realizzate in successive versioni dello stesso.
\begin{itemize}
\item Il software è realizzato solamente in lingua italiana
\item L'invio dei codici relativi ai pacchetti di viaggio da inviare agli amici del cliente verrà effettuato dal cliente stesso tramite mezzi di comunicazione a sua discrezione. In futuro si può prevedere di estendere le funzionalità del software rendendolo in grado di inviare il codice del pacchetto tramite e-mail o SMS.
\item Gli unici prodotti base previsti per il momento sono voli, hotel e attività di vario genere. È prevista l'aggiunta di ulteriori tipologie di prodotti base in futuro.
\item Il sistema non prevede la possibilità di vendere prodotti base singoli. L'unità minima di acquisto è il pacchetto preconfigurato.
\item Il sistema non prevede la possibilità di inserire più di un hotel nel pacchetto. Tale limitazione potrà essere rimossa in futuri aggiornamenti del sistema.
\item Nella prima versione del sistema una gift list conterrà solo attività. Sarà, in futuro e se ritenuto necessario, possibile aggiungere ulteriori tipologie di prodotti base alla gift list.
\item Il sistema, nella sua prima versione, prevede che l'hotel selezionato dal cliente sia prenotato automaticamente a partire dalla data di partenza del viaggio e per l'intera durata del pacchetto.
\item Il sistema prevede che, nel momento dell'acquisto, siano prenotati automaticamente un trasporto dalla città di partenza alla città pubblicizzata dal pacchetto per la data di partenza selezionata e un trasporto dalla città pubblicizzata dal pacchetto alla città di ritorno selezionata durante l'acquisto.
\end{itemize}
	
\subsection{Glossario}
\subsubsection{Definizioni}

{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.5cm}
		\begin{tabular}{|c|p{8.4cm}|}
	\hline
	\cellcolor{SkyBlue}\textbf{Parola chiave} & \cellcolor{SkyBlue}\textbf{Definizione}\\
	\hline
	Pacchetto preconfigurato & Unità minima di vendita. È composto almeno da un viaggio di andata, un viaggio di ritorno successivo al viaggio di andata e una prenotazione in un hotel per il periodo compreso fra i due viaggi. Può inoltre contenere alcune attività predefinite\\
	\hline
	Attività & È un coupon per un'escursione, gita o simile esperienza fruibile durante la vacanza. È un prodotto base.\\
	\hline
	Prodotto base & Un elemento che compone i pacchetti di viaggio.\\
	\hline
	Gift list & Insieme di prodotti base inseriti dal cliente all'interno di un pacchetto che possono essergli regalati dagli amici.\\
	\hline
	Viaggio & Spostamento mediante un generico mezzo di trasporto da un punto iniziale ad uno finale. È un prodotto base.\\
	\hline
	Pacchetto acquistato & Insieme composto da un pacchetto preconfigurato più ogni attività acquistata dal cliente o, nel caso di acquisto da gift list, da suoi amici.\\
	\hline
	
	\end{tabular}
}

\subsubsection{Acronimi}

{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{1.53cm}
		\begin{tabular}{|c|c|}
	\hline
	\cellcolor{SkyBlue}\textbf{Acronimo} & \cellcolor{SkyBlue}\textbf{Definizione}\\
	\hline
	TD & TravelDream\\
	\hline
	C & Cliente\\
	\hline
	A & Amico del cliente\\
	\hline
	I & Impiegato\\
	\hline
	SA & Admin del sistema\\
	\hline
	PP & Pacchetto preconfigurato\\
	\hline
	PA & Pacchetto acquistato\\
	\hline
	G & Goal\\
	\hline
	MF & Macro-funzionalità\\
	\hline
	AS & Application Server\\
	\hline	
	\end{tabular}
}

\subsection{Struttura del documento}
La sezione 2 di questo documento contiene una descrizione generale del software: 
\begin{itemize}
\item Utenti del sistema e caratteristiche
\item Analisi del prodotto
\item Caratteristiche degli utenti
\item Vincoli generali
\item Ipotesi preliminari
\item Requisiti da analizzare in futuro
\end{itemize}

La sezione 3 si occupa dei requisiti funzionali e non funzionali, analizzando ciascuno di essi nel dettaglio, oltre a qualsiasi altra forma di vincolo alla quale dovrà sottostare il software.

La sezione 4 invece è l'appendice del documento in cui sono specificati i modelli alloy generati per l'applicazione.
\newpage
\section{Descrizione generale}
\begin{comment}
Il software nasce in un sistema nel quale tutte le operazioni sono attualmente effettuate in maniera manuale da un impiegato per conto di un cliente. Attualmente l'impiegato raccoglie le informazioni dai vari siti di alberghi, compagnie di volo, etc le propone al cliente; il software nasce quindi ex-novo, non essendo presente una base di dati già presente che si possa sfruttare per raccogliere i dati da mostrare al cliente.
\end{comment}
\subsection{Utenti del sistema e caratteristiche}
Gli attori del sistema rappresentano la totalità delle entità del mondo reale che interagiscono in
maniera attiva con la piattaforma software da sviluppare. Analizzando il documento di specifica ed
il dominio applicativo in cui si andrà a collocare l'applicativo web sono emerse le cinque figure
seguenti:
\begin{itemize}
\item \textbf{Utente non registrato}: è il generico utente del sistema che si connette all'applicativo web con la sola possibilità di diventare cliente qualora si registri nel sistema attraverso l'apposito modulo.
\item \textbf{Cliente}: è l'utente specifico del sistema, cioè quello per il quale il sistema è stato pensato. Affinché un utente non registrato diventi cliente è necessario che egli effettui il processo di registrazione in cui sono richiesti i propri dati personali e di fatturazione.
Il cliente può visualizzare e cercare pacchetti fra i pacchetti preconfigurati, selezionarne uno e personalizzarlo (ad esempio, scegliendo le date del viaggio o cambiando hotel, escursioni), eventualmente inserendo delle attività ludiche (escursioni, gite, ecc) in una gift list.
Il cliente può acquistare il pacchetto personalizzato.
Il cliente può infine condividere il suo viaggio con degli amici, inviando esternamente al sistema (ad esempio via email) un codice identificativo del pacchetto acquistato.
\item \textbf{Amico di un cliente} (amico): è un particolare tipo di utente non registrato che ha ricevuto esternamente al sistema (ad esempio via email) un codice relativo ad un pacchetto acquistato da un cliente. L'amico può visualizzare il pacchetto direttamente tramite il codice fornitogli e, previa registrazione (diventando quindi un Cliente a sua volta), decidere di partecipare a sua volta al viaggio o acquistare un'attività ludica presente nella gift list, regalandola al cliente che gli ha proposto il viaggio.
\item \textbf{Impiegato dell'agenzia} (impiegato): è un utente del sistema, inserito in esso direttamente dall'admin, che si occupa di inserire e modificare i prodotti base nel sistema. L'impiegato può anche creare pacchetti preconfigurati, che sono poi offerti ai clienti dal sistema.
\item \textbf{Amministratore di sistema} (admin): è il responsabile dell'applicativo web. È l'unico utente in grado di inserire ed eliminare impiegati nel sistema. L'admin è inserito nell'applicativo web alla sua creazione.
\end{itemize}
\subsection{Analisi del prodotto}
Il software nasce in un sistema nel quale tutte le operazioni sono attualmente effettuate in maniera manuale da un impiegato per conto di un cliente. Attualmente l'impiegato raccoglie le informazioni dai vari siti di alberghi, compagnie di volo, etc, per poi proporle al cliente; il software nasce quindi ex-novo, non essendo presente una base di dati già presente che si possa sfruttare per raccogliere i dati da mostrare al cliente.
\\Vista la mancanza di altri sistemi software, il software da sviluppare sarà indipendente da altri sistemi, essendo difatto un sistema self-contained che conterrà sia la logica applicativa che quella di presentazione.
\subsubsection{Interfacce di sistema}
Il sistema non prevede alcuna interfaccia verso sistemi esterni.
\newpage
\subsubsection{Interfacce utente}
Il sistema presenterà una schermata iniziale in cui sarà possibile scegliere tra le seguenti tre opzioni principali:
\begin{enumerate}
\item eseguire l'accesso attraverso delle credenziali, per gli utenti già registrati
\item accedere ad un pacchetto viaggio condiviso, tramite il relativo codice
\item eseguire la registrazione per l'utilizzo completo del sistema
\end{enumerate}

\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{IngressoAlSistema.jpg}
\caption{Schermata di accesso}
\label{fig:Schermata di accesso}
\end{figure}
La prima opzione consentirà all'utente del sistema di inserire le proprie credenziali di accesso. In seguito all'inserimento di credenziali valide da parte di un cliente, egli verrà reindirizzato alla pagina principale di utilizzo del sistema. In questa pagina saranno disponibili tutte le opzioni che consentiranno al cliente di sfruttare tutte le funzionalità del sistema. Seguono alcuni mockup che mostrano graficamente come il sistema interagirà con il cliente.
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{Home.jpg}
\caption{Homepage}
\label{fig:Homepage}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{schermataPachetto.png}
\caption{Acquisto Pacchetto Viaggio}
\label{fig:Acquisto Pacchetto Viaggio}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{Struttura.png}
\caption{Selezione Struttura}
\label{fig:SelezionaStruttura}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{AttGL.png}
\caption{Selezione Attività e Gift List}
\label{fig:Attivita}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{Riepilogo.png}
\caption{Schermata di riepilogo}
\label{fig:Riepilogo}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{GestioneProfilo.png}
\caption{Pagina di gestione profilo cliente}
\label{fig:Profilo}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{GestioneAcquisti.png}
\caption{Pagina di gestione pacchetto acquistato}
\label{fig:Pacchetto Acquistato}
\end{figure}
\begin{figure}[H]
\centering
\includegraphics[width=13.7cm]{AcquistoPacchettoAmico.png}
\caption{Pagina di visualizzazione pacchetto suggerito}
\label{fig:Amico}
\end{figure}
\subsubsection{Interfacce hardware}
Il sistema non prevede alcuna interfaccia hardware.
\subsubsection{Interfacce software}
\begin{itemize}
\item \textbf{Database Management System}:\\
Nome: MySQL\\
Version number: 5.6.12
\item \textbf{Application Server}:\\
Nome: GlassFish\\
Version number: 4.0
\item \textbf{Sistema Operativo}:\\
Il sistema potrà essere installato su un qualsiasi sistema operativo supportante le tecnologie descritte sopra.
Il sistema sarà sviluppato e testato su piattaforma montante Windows 8 come sistema operativo.
\end{itemize}
\subsubsection{Interfacce di comunicazione}
Le interfacce di comunicazione del sistema riguardano essenzialmente i protocolli di rete necessari per il trasferimento delle informazioni sul web. 
Per il corretto funzionamento del sistema i requisiti minimi prevedono il corretto funzionamento delle seguenti interfacce di rete.

\begin{table}[h]
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.7cm}
	\begin{tabular}{|c|c|p{6.2cm}|}
	\hline
	\cellcolor{SkyBlue}\textbf{Protocollo} & \cellcolor{SkyBlue}\textbf{Porta} & \cellcolor{SkyBlue}\textbf{Applicazione}\\
	\hline
	TCP & 80 & HTTP\\
	\hline
	TCP & 3306 & DBMS (Solo se installato su diverso server fisico)\\
	\hline
	
	\end{tabular}
}
\end{table}
Nella prima versione del software, DBMS e AS saranno installati sullo stesso server fisico.
\subsubsection{Vincoli sull'occupazione di memoria}
Lato server, il software dovrà essere in grado di funzionare su un server con almeno 4GB di memoria RAM e di 500GB di memoria di massa.\\\\
Per quanto riguarda il lato client, invece, dovrà essere in grado di funzionare su macchine con almeno 512MB di memoria RAM. Non è previsto un rilevante utilizzo di memoria di massa.
\subsubsection{Operazioni}
Gli utenti che possono eseguire operazioni sul sistema sono:
\begin{itemize}
\item Gli utenti non registrati
\item I clienti
\item Gli amici dei clienti
\item Gli impiegati dell'agenzia
\item L'admin
\end{itemize}
Tutte le operazioni che possono essere eseguite dagli utenti elencati sono stati già definiti in precedenza nella sezione ""Utenti del sistema e caratteristiche"".
\subsubsection{Vincoli per l'installazione}
\begin{itemize}
\item Per quanto riguarda \emph{l'installazione sul server} su cui risiederà la logica applicativa ed il database del software, è necessario che siano presenti i seguenti componenti:
\begin{enumerate}
\item Una Java Virtual Machine
\item Un'Application Server
\item Un DataBase Management System
\item La quantità richiesta di memoria RAM
\item La quantità richiesta di memoria di massa
\end{enumerate}
\item Per quanto riguarda \emph{gli utenti che utilizzeranno il sistema}, è sufficiente che dispongano di un browser per la navigazione web compatibile con Javascript installato sul proprio dispositivo di accesso alla rete.
\end{itemize}
\subsection{Caratteristiche degli utenti}
Gli utenti del sistema devono avere una buona conoscenza di Internet e dell'utilizzo di un browser web.
\subsection{Vincoli generali}
\subsubsection{Politiche di regolamentazione}
Il sistema software da sviluppare non possiede alcune politica di regolamentazione.
\subsubsection{Limitazioni hardware}
Il sistema software da sviluppare non ha alcuna limitazione legata all'hardware sul quale deve essere eseguito.
\subsubsection{Interfacce con altri applicativi software}
Il sistema non prevede alcuna interfaccia per altri applicativi software.
\subsubsection{Operazioni parallele}
Il prodotto software da sviluppare dovrà supportare l'utilizzo contemporaneo da parte di più utenti. Per questo motivo è necessario garantire un controllo di concorrenza sia a livello applicativo che a livello del database.
%\subsubsection{Documentazione da produrre}
\subsubsection{Architettura del sistema}
Il sistema sarà sviluppato su una piattaforma Java Enterprise Edition (JEE), supportato da un database in cui saranno memorizzate tutte le informazioni relative ai clienti, ai prodotti base, ai pacchetti preconfigurati e alle gift list. Per accedere al sistema, gli utenti dovranno utilizzare un qualsiasi browser per la navigazione web in grado di supportare gli script JavaScript e di una connessione internet attiva.
\subsubsection{Protocollo di handshake}
Il sistema non prevede alcun protocollo di handshake, utilizza le modalità di connessione native dei protocolli HTTP.
\subsection{Ipotesi preliminari}
\subsubsection{Assunzioni}
I requisiti scritti in questo documento si basano sulle seguenti assunzioni:
\begin{enumerate}
\item La Java Virtual Machine è già presente sulla macchina
\item Gli utenti hanno una connessione internet funzionante e con velocità nella media
\item Il sistema fornisce un admin di default
\item Il sistema non supporta più di un admin
\item Il sistema assume che un pacchetto acquistato sia composto almeno da un viaggio di andata, un viaggio di ritorno ed una prenotazione in un soggiorno nella destinazione del pacchetto.
\item La personalizzazione di un pacchetto preconfigurato comprende l'aggiunta di attività opzionali, la selezione della data di partenza e la modifica dell'opzione di soggiorno.
\item L'acquisto di un pacchetto suggerito implica l'acquisto obbligato dell'intera configurazione del P.A. suggerito così com'è in quel momento, comprendente tutti i suoi prodotti base e le impostazioni di data, viaggi e soggiorno.
\item La condivisione del pacchetto può essere effettuata solo in seguito al suo acquisto.
\item La personalizzazione del pacchetto per quanto riguarda la data della partenza e dell'opzione di soggiorno può essere effettuata esclusivamente prima dell'acquisto. Solo le attività possono essere aggiunte anche una volta che il pacchetto è già stato acquistato.
\item I soggiorni ed i trasporti compatibili con un pacchetto preconfigurato sono sempre disponibili nelle date proposte dal pacchetto stesso.
\item Le attività rappresentano dei coupon spendibili dal cliente in un qualsiasi momento compatibile durante la vacanza. I momenti compatibili sono precisati nella descrizione dell'attività e dipendono solo dai fornitori di tale attività.
\item Le attività possono essere acquistate al più una volta.
\item Le attività già presenti nel pacchetto preconfigurato, se presenti, sono obbligatoriamente acquistate con il pacchetto stesso. Non c'è quindi modo per l'utente di rimuoverle dal pacchetto.
\end{enumerate}

\subsubsection{Specifiche generali}
\begin{itemize}
\item Il software prevede che l'utente non registrato possa solamente registrarsi come cliente o visualizzare un pacchetto di cui ha ricevuto il codice prima di effettuare qualsiasi operazione nel sistema.
\item Il software prevede che l'amico di un utente registrato possa visualizzare unicamente il pacchetto presentatogli, senza potervi partecipare o acquistare prodotti base dalla gift list prima di aver effettuato la registrazione o il login con il suo account.
\end{itemize}
\subsection{Requisiti da analizzare in futuro}
\begin{itemize}
\item Il committente prevede in futuri aggiornamenti l'aggiunta di nuovi tipi di prodotti base al software. Il sistema deve quindi permettere l'aggiunta di nuove tipologie di mezzi di trasporto, alloggi e attività ludiche senza dover modificare la logica del sistema.
\item In futuro sarà possibile introdurre nel sistema interfacce verso social network e altri mezzi di condivisione pacchetti viaggio.
\end{itemize}
\newpage
\section {Analisi dei requisiti}
\subsection {Requisiti funzionali}
\subsubsection{Possibili scenari}
In questa sezione vengono presentati dei possibili scenari d'uso dell'applicativo web.
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|p{13.7cm}|}{\cellcolor{SkyBlue} \textbf{Un utente non registrato vuole acquistare un pacchetto viaggio}}\\
	\hline
	Paolo, un ragazzo sportivo e con la passione per il kite surf, sta cercando da un paio di giorni una buona offerta per un viaggio a Gold Coast, in Australia.
	Viene a conoscenza di TravelDream da un amico che lo invita a guardare i pacchetti di viaggio disponibili.\\
	
	Paolo decide quindi di cogliere l'occasione al volo e si reca sul sito web di TravelDream.
	Una volta effettuata la procedura di registrazione, effettua una ricerca tra pacchetti preconfigurati con destinazione Gold Coast e ne trova uno interessante nel periodo natalizio. Decide quindi di guardarne i dettagli e nota che la struttura è l'ideale per le sue esigenze ma che il volo suggerito parte da Bologna e decide quindi di modificarlo selezionando come partenza Milano.\\
	
	Soddisfatto della scelta Paolo decide di acquistare il pacchetto e termina quindi la procedura pagando la quota prevista per il viaggio.\\
	\hline       	
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|p{13.7cm}|}{\cellcolor{SkyBlue} \textbf{Un cliente manda un pacchetto viaggio a un amico che accetta e vi partecipa}}\\
	\hline
	Giulia e Gaia sognano da sempre una vacanza ai Caraibi. Decidono quindi di prenotare la vacanza insieme.\\
	Giulia fa sapere all'amica che è iscritta a un nuovo sito di vendita di pacchetti viaggio chiamato TravelDream e che quindi può occuparsi lei dell'acquisto.\\
	Decide quindi di fare login nel sito web e di mettersi a cercare dei pacchetti viaggio convenienti.\\
	Una volta trovato il viaggio giusto per loro procede all'acquisto.\\
	Decide quindi di far vedere a Gaia il pacchetto che ha deciso di comprare in modo che anche lei possa guardarlo e, se soddisfatta a sua volta, parteciparvi.\\
	Utilizzando il comando per l'invio ad un amico dalla schermata del pacchetto viaggio, Giulia ottiene un codice che poi manda via mail a Gaia.\\
	Gaia riceve la mail e la apre, si reca sul sito di TravelDream e inserisce il codice ricevuto. Comincia a guardare con interesse il viaggio scelto da Giulia e, entusiasta, decide di parteciparvi con lei. Decide quindi anche lei di sottoporsi alla procedura di registrazione e acquista a sua volta il viaggio suggeritole.\\
	Gaia fa logout dal sistema e chiama Giulia per complimentarsi per l'ottima scelta del pacchetto.\\
	\hline       	
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|p{13.7cm}|}{\cellcolor{SkyBlue} \textbf{Un cliente modifica la gift list su un pacchetto precedentemente acquistato}}\\
	\hline
	Gaia, scorrendo la lista di attività opzionali per il viaggio ai Caraibi appena acquistato, vede una lezione di "Relic Hunting" e decide di inserirla nella sua gift list, sperando che il suo ragazzo Bruno gliela regali.\\
	Gaia accede quindi alla sua pagina personale, seleziona dalla lista il viaggio ai Caraibi ed aggiunge alla gift list la lezione di "Relic Hunting".\\
	Gaia quindi condivide col suo ragazzo il codice di condivisione del pacchetto ed esegue logout dal sito.\\
	\hline
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|c|}{\cellcolor{SkyBlue} \textbf{Un cliente crea una gift list e un amico compra un pacchetto}}\\
	\hline
	Mario, studente di ingegneria al Politecnico di Milano, decide di concedersi una vacanza alla fine della sessione estiva degli esami.\\
	Si reca sul sito dell'agenzia TravelDream, da cui è solito acquistare i viaggi, e fa login nel sistema.\\
	Guardando tra i vari pacchetti viaggio ne trova uno interessante per New York. Decide di acquistare il pacchetto composto dall'hotel Casablanca e dal viaggio di andata e ritorno.\\
	Mario però è molto interessato all'acquisto di un'escursione all'Empire State Building e ad un'altra ad Ellis Island ma, non potendosi permettere altre spese, ed essendo il suo compleanno alle porte, decide di inserirle in una gift list.\\
	Mario invia, mediante l'apposito comando, il codice del pacchetto via mail al suo amico Michele.\\
	Michele si vede recapitare la mail nella propria casella di posta e,dopo aver inserito il codice del pacchetto nel sito web, vedendo il prodotto base acquistabile nella gift list decide di fare una colletta con gli altri amici di Mario per acquistare l'escursione all'Empire State Building.\\
	Michele procede nella sezione acquista ma, essendo non registrato, è obbligato dal sistema a effettuare la registrazione. Dopo essersi registrato completa la procedura di acquisto.\\
	\hline       	
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|p{13.7cm}|}{\cellcolor{SkyBlue} \textbf{Un cliente acquista ed inserisce una nuova attività in un pacchetto precedentemente comprato}}\\
	\hline
	Mario, avendo vinto la borsa di studio come miglior studente del decennio, decide di inserire nel pacchetto viaggio precedentemente acquistato anche il giro in elicottero sopra Manhattan.\\
	Si reca sul sito dell'agenzia TravelDream e fa login nel sistema.\\
	Accedendo alla sua pagina personale, seleziona dalla lista il viaggio a New York e raggiunge la schermata di personalizzazione escursioni.\\
	Mario quindi ricerca fra le escursioni il giro in elicottero e lo aggiunge al viaggio.\\
	Mario infine procede col pagamento e, soddisfatto dell'acquisto, esegue logout dal sistema.\\
	\hline       	
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|c|}{\cellcolor{SkyBlue} \textbf{Un impiegato inserisce un nuovo hotel nel sistema}}\\
	\hline
	Guido, impiegato della TravelDream, e responsabile della gestione del sito di e-commerce, deve inserire nel sistema l'hotel Stella d'Italia, di nuova apertura.\\
	Guido fa login nel sistema e naviga nell'applicativo fino al raggiungimento della sezione di inserimento hotel.\\
	Comincia ad inserire i dati relativi alla struttura nelle sezione apposite e, una volta terminato, conferma l'input e torna alla pagina principale dove, avendo ultimato le mansioni della giornata, decide di effettuare il logout dal sistema e tornare a casa.\\
	\hline       	
	\end{tabular}
}
\\\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|c|}{\cellcolor{SkyBlue} \textbf{Un impiegato modifica un hotel}}\\
	\hline
	Guido, tornato al lavoro dopo la pausa pranzo, riceve un'email dalla direzione dell'hotel Belvedere, che chiede venga aggiunta la presenza della nuova piscina presente nella struttura.\\
	Guido decide di eseguire subito l'operazione e, dopo aver fatto login nel sistema, si porta nella sezione degli hotel.\\
	Da qui cerca l'hotel e, una volta trovato, seleziona l'opzione per la modifica, aggiorna la descrizione della struttura e conferma.\\
	Guido può quindi andare avanti con il resto del lavoro della giornata.\\ 
	\hline       	
	\end{tabular}
}
\\\\
{	
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
	\begin{tabular}{|p{13.7cm}|}
	\hline
	\multicolumn{1}{|c|}{\cellcolor{SkyBlue} \textbf{L'admin inserisce un nuovo impiegato nel sistema}}\\
	\hline
	Bruno, amministratore del sistema, riceve la richiesta dal CEO di TravelDream di inserire nel sistema il neoassunto Giovanni.\\
	Bruno accede quindi con le sue credenziali e inserisce i dati di Giovanni nel sistema.\\
	Bruno infine esegue logout ed invia a Giovanni le sue nuove credenziali per l'accesso.\\
	\hline
	\end{tabular}
}
\\\\
\subsubsection{Identificazione dei requisiti}
In seguito all'analisi degli obiettivi del software, sono stati individuati i seguenti requisiti funzionali:\\
\textbf{G1: Consentire ad un impiegato la gestione dei prodotti base e dei pacchetti preconfigurati}
\begin{itemize}
\item F1: Consentire all'impiegato l'aggiunta di prodotti base e la creazione di pacchetti preconfigurati
\item F2: Consentire all'admin del sistema di nominare degli impiegati
\end{itemize}
\textbf{G2: Consentire ad un cliente di ricercare, personalizzare ed acquistare un pacchetto preconfigurato}
\begin{itemize}
\item F3: Consentire la registrazione di un nuovo utente e la gestione dei suoi dati anagrafici
\item F4: Esplorare la lista dei pacchetti preconfigurati disponibili, con la possibilità di ricercarli per destinazione o per data
\item F5: Personalizzare un pacchetto preconfigurato, inserendo la data del viaggio e modificando l'opzione di soggiorno
\item F6: Ultimare l'acquisto del pacchetto	
\end{itemize}
\textbf{G3: Consentire ad un cliente di suggerire un pacchetto  acquistato ai suoi amici}
\begin{itemize}
\item F7: Generare un codice identificativo per il pacchetto
\end{itemize}
\textbf{G4: Consentire agli amici di visualizzare ed acquistare i pacchetti acquistati che gli sono stati suggeriti}
\begin{itemize}
\item F8: Visualizzare un pacchetto in base al suo codice identificativo
\item F9: Acquistare il pacchetto personalizzato dall'amico del cliente
\end{itemize}
\textbf{G5: Consentire al cliente di aggiungere prodotti base opzionali ad una gift list collegata al pacchetto acquistato}
\begin{itemize}
\item F10: Creare una gift list per il pacchetto generato
\item F11: Aggiungere i prodotti base alla gift list
\end{itemize}
\textbf{G6: Consentire agli amici di acquistare prodotti base nella gift list di un pacchetto di cui hanno ricevuto il codice identificativo dopo essersi registrati come clienti}
\begin{itemize}
\item F12: Esplorare la gift list di un pacchetto ricevuto
\item F13: Acquistare prodotti base all'interno della gift list
\end{itemize}
\newpage
\subsubsection{Casi d'uso}
In questa sezione sono presentati alcuni casi d'uso al fine di spiegare più nel dettaglio le funzionalità definite in precedenza, mettendo in risalto i singoli passi che ogni agente del sistema deve svolgere per usufruirne. 

Ogni singolo caso d'uso sarà composto da una rappresentazione tabellare, in cui viene descritto ciò che avviene in maniera testuale, seguita da un sequence diagram per esplicitare meglio le azioni necessarie ed il flusso temporale degli eventi.\\
\textbf{Use case diagram}
\begin{landscape}
\includegraphics[width=24cm]{UML}
\end{landscape}
\paragraph{Nominare un nuovo impiegato}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Nominare un nuovo impiegato}}\\ \hline
    Agenti & Admin\\ \hline
    Goal & G1\\ \hline
    Condizione di ingresso &  L'admin di sistema (SA) è stato creato e dispone di credenziali di accesso valide\\ \hline
    Flusso degli eventi & 1) SA raggiunge la pagina di login e il sistema mostra il form apposito\\
    ~ & 2) SA effettua il login \\ 
    ~ & 3) SA seleziona la voce 'Aggiungi impiegato' \\
    ~ & 4) SA compila il form con i dati dell'impiegato\\
    ~ & 5) SA conferma la creazione dell'impiegato \\ \hline
    Condizioni di uscita & Il sistema verifica i dati e conferma l'inserimento dell'impiegato con una password temporanea \\ \hline
	Eccezioni & Nel caso in cui, nel corso della verifica dei dati della condizione di uscita, venisse rilevato dal sistema un campo vuoto o contenente informazioni inconsistenti, SA viene notificato e il caso d'uso riprende dal punto 3.\\ \hline
    \end{tabular}
}

\includegraphics[height=20cm]{inserimentoImpiegato}

\paragraph{Registrare un nuovo account}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Registrare un nuovo account}}\\ \hline
    Agenti & Utente non registrato\\ \hline
    Goal & L'utente non registrato si registra come cliente nel sistema\\ \hline
    Condizione di ingresso & L'utente non registrato (U) raggiunge la pagina principale di TravelDream \\ \hline
    Flusso degli eventi & 1) Il sistema mostra il form per il login \\
    ~ & 2) U entra nella sezione per la registrazione \\ 
    ~ & 3) Il sistema mostra la pagina di registrazione \\
    ~ & 4) U inserisce i propri dati e conferma l'input \\ \hline
    Condizioni di uscita & Il sistema verifica i dati e conferma all'utente l'avvenuta registrazione nel sistema \\ \hline
	Eccezioni & Nel caso in cui, nel corso della verifica dei dati della condizione di uscita, venisse rilevato dal sistema un campo vuoto o contenente informazioni inconsistenti, l'utente viene notificato e il caso d'uso riprende dal punto 3.\\ 
	~ & Nel caso in cui il sistema rilevi che i dati identificativi sono già presenti all'interno del sistema notifica l'utente e lo use case riprende dal punto 3.\\\hline
    \end{tabular}
}

\includegraphics[height=21cm]{registrazione}

\paragraph{Accedere al sistema}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Accedere al sistema}}\\ \hline
    Agenti & Admin, Cliente, Impiegato\\ \hline
    Goal & Login\\ \hline
    Condizione di ingresso & L'utente (U) dispone di credenziali di accesso valide \\ \hline
    Flusso degli eventi & 1) U si reca sulla pagina principale del sistema  \\
    ~ & 2) U inserisce le sue credenziali di accesso\\
    ~ & 3) U conferma che le credenziali inserite sono corrette\\ \hline
    Condizioni di uscita & Il sistema verifica che le credenziali inserite siano corrette e conferma l'avvenuto accesso al sistema \\ \hline
	Eccezioni & Nel caso in cui il sistema riveli che le credenziali di accesso non sono corrette, informa l'utente che dovrà rieffettuare la procedura di login. Nessuna modifica viene registrata sul sistema.\\ \hline
    \end{tabular}
}
\includegraphics[height=20cm]{login}
\paragraph{Modificare dati anagrafici}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Modificare  dati anagrafici}}\\ \hline
    Agenti & Cliente, Impiegato\\ \hline
    
    Condizione di ingresso & L'utente (U) è correttamente registrato al sistema e dispone di credenziali di accesso valide\\
    ~ & U ha effettuato il login \\ \hline
    Flusso degli eventi & 1) U si reca sulla Homepage del suo profilo  \\
    ~ & 2) U seleziona "Modifica dati anagrafici"\\
    ~ & 3) U modifica i dati che sono da aggiornare\\
    ~ & 4) U seleziona il "Salva modifiche"\\ \hline
    Condizioni di uscita & Il sistema verifica che i dati inseriti siano consistenti e procede con l'aggiornamento dei dati all'interno del sistema \\ \hline
	Eccezioni & Nel caso in cui il sistema riveli che i dati inseriti non sono corretti (per esempio, uno dei campi obbligatori è vuoto) notifica all'utente che la modifica dei dati non è avvenuta e mostra nuovamente la pagina con i dati inseriti dall'utente in modo da permettere che questi effettui le dovute correzioni. Nessuna modifica viene registrata all'interno del sistema.\\ \hline
    \end{tabular}
}

\includegraphics[height=20cm]{modificaAnagrafica}

\paragraph{Inserire Prodotto Base}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue} \textbf{Inserire prodotto base}}\\ \hline
    Agenti & Impiegato \\ \hline 
    Goal & G1\\ \hline
    Condizione di ingresso & L'impiegato (I) raggiunge la pagina dei prodotti base\\ \hline
    Flusso degli eventi & 1) I entra nella sezione di inserimento dei prodotti base\\ 
    ~ & 2) Il sistema mostra la pagina di inserimento del prodotto base\\
    ~ & 3) I inserisce i dati e conferma l'input\\ \hline
    Condizioni di uscita & Il sistema verifica i dati e notifica all'impiegato l'avvenuto inserimento del pacchetto base\\ \hline
    Eccezioni & Nel caso in cui, nel corso della verifica dei dati della condizione di uscita, il pacchetto base risulti uguale a un pacchetto base già presente nel sistema, il sistema notifica l'impiegato dell'errore e si procede nuovamente con il punto 1.\\
    \hline
    \end{tabular}
}

\includegraphics[height=20cm]{inserimentoProdottoBase}

\paragraph{Modificare Prodotto Base}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Modificare prodotto base}}\\ 
    \hline
    Agenti & Impiegato \\
    \hline
    Goal & G2\\ 
    \hline
    Condizione di ingresso & L'impiegato (I) raggiunge la pagina dei prodotti base\\ 
    \hline
    Flusso degli eventi & 1) Il sistema mostra la pagina dei prodotti base in cui è presente un campo di ricerca\\
    ~ & 2) I inserisce la chiave di ricerca del prodotto e conferma l'input \\
    ~ & 3) Il sistema verifica i dati e mostra una lista dei prodotti base che corrispondono al parametro di ricerca immesso\\
    ~ & 4) I seleziona la modifica del prodotto base\\
    ~ & 5) Il sistema mostra la pagina di modifica del prodotto base\\
    ~ & 6) I effettua le modifiche necessarie\\
    \hline
    Condizioni di uscita & Il sistema verifica i dati e notifica all'impiegato l'avvenuta modifica del prodotto base\\ \hline
	Eccezioni & Nel caso in cui, nel corso della verifica dei dati al punto 3, il parametro non trovasse nessuna corrispondenza tra i pacchetti base presenti nel sistema, il sistema mostra una lista vuota di pacchetti base e il caso d'uso riprende dal punto 2.\\ 
	~ & Nel caso in cui, nel corso della verifica dei dati della condizione di uscita, venisse rilevato dal sistema un campo vuoto o contenente informazioni inconsistenti, il sistema notifica l'impiegato dell'errore e si procede rieseguendo nuovamente il caso d'uso. \\
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{modificaProdottoBase}

\paragraph{Creare un pacchetto preconfigurato partendo da singoli prodotti}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Creare un pacchetto preconfigurato partendo dai singoli prodotti}}\\ 
    \hline
    Agenti & Impiegato \\
    \hline
    Goal & G1\\ 
    \hline
    Condizione di ingresso & L'impiegato (I) è correttamente registrato al sistema ed ha effettuato l'accesso\\
    ~ & Tutti i prodotti base che l'impiegato vuole inserire all'interno del pacchetto di viaggio sono stati inseriti all'interno del sistema\\ 
    \hline
    Flusso degli eventi & 1) I si reca sulla pagina principale del sistema\\
    ~ & 2) I seleziona "Creazione nuovo pacchetto viaggio" \\
    ~ & 3) I inserisce i singoli prodotti all'interno del pacchetto, inserendo almeno un volo di andata, uno di ritorno e un hotel per soggiornare durante l'intero periodo \\
    ~ & 4) I seleziona la durata del viaggio e le date nelle quali è possibile effettuare la partenza \\
    ~ & 5) I seleziona "Conferma creazione pacchetto"\\
    \hline
    Condizioni di uscita & Il sistema registra il pacchetto viaggio\\ \hline
	Eccezioni & Nel caso in cui I non inserisca almeno un viaggio di andata, uno di ritorno e un hotel il sistema notifica l'errore e nessuna modifica viene registrata all'interno del sistema stesso. I riprende dal punto 3 inserendo i prodotti mancanti\\ 
	~ & Nel caso in cui I non inserisca almeno una data di partenza il sistema notifica l'errore e lo use case riprende dal punto4\\
	~ & Nel caso in cui la durata del viaggio non sia maggiore di 0, il sistema notifica l'errore e lo use case riprende dal punto 4\\
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{creazionePacchetto}

\paragraph{Ricercare un pacchetto preconfigurato}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Ricercare  un pacchetto preconfigurato}}\\ 
    \hline
    Agenti & Cliente\\
    \hline
    Goal & G2\\ 
    \hline
    Condizione di ingresso & Il cliente (C) è correttamente registrato al sistema ed ha effettuato l'accesso\\ 
    \hline
    Flusso degli eventi & 1) C si collega alla pagina principale del sistema\\
    ~ & 2) C si reca nella sezione "Ricerca" ed indica di voler effettuare una ricerca\\
    ~ & 3) C inserisce la destinazione desiderata o l'intervallo entro il quale ricercare la data di partenza\\
    ~ & 4) C avvia la ricerca\\
    \hline
    Condizioni di uscita & Il sistema mostra un'elenco di pacchetti compatibili con i parametri inseriti dall'utente.\\
	\hline
	Eccezioni & Nessuna eccezione \\
	\hline
    \end{tabular}
}

\includegraphics[width=13cm]{ricerca}

\paragraph{Personalizzare un pacchetto preconfigurato}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{p{13.4cm}}{\cellcolor{SkyBlue}\textbf{Personalizzare un pacchetto preconfigurato}}\\ 
    \hline
    Agenti & Cliente\\
    \hline
    Goal & G2\\ 
    \hline
    Condizione di ingresso & Il Cliente (C) è correttamente registrato al sistema ed ha effettuato l'accesso\\ 
    \hline
    Flusso degli eventi & 1) C effettua la ricerca di un pacchetto\\
    ~ & 2) C seleziona il pacchetto che desidera personalizzare\\
    ~ & 3) C personalizza il pacchetto inserendo i dati richiesti\\
    ~ & 4) C conferma la modifica\\ 
    \hline
    Condizioni di uscita & Il sistema registra le personalizzazioni al pacchetto\\ \hline
	Eccezioni & Nessuna eccezione\\ 
	\hline
    \end{tabular}
}

\includegraphics[width=13cm]{personalizzazionePacchettoPreconfigurato}

\paragraph{Suggerire un pacchetto acquistato a un amico}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|p{13.4cm}|}{\cellcolor{SkyBlue}\textbf{Suggerire un pacchetto acquistato a un amico}}\\ 
    \hline
    Agenti & Cliente\\
    \hline
    Goal & G3\\ 
    \hline
    Condizione di ingresso & Il Cliente (C) è correttamente registrato al sistema, ha effettuato l'accesso, ha già acquistato il pacchetto che vuole condividere e il pacchetto non è ancora stato utilizzato (la data attuale è antecedente alla data di partenza)\\ 
    \hline
    Flusso degli eventi & 1) C si reca sulla pagina principale del sistema\\
    ~ & 2) C si reca nella sezione "I miei pacchetti viaggio"\\
    ~ & 3) C seleziona il pacchetto viaggio che desidera condividere\\
    ~ & 4) C seleziona "Invia identificativo per condivisione"\\
    \hline
    Condizioni di uscita & Il sistema genera un codice identificativo univoco per il pacchetto e lo mostra al cliente.\\ \hline
	Eccezioni & Nessuna eccezione\\ 
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{suggerirePacchettoAmico}

\paragraph{Visualizzare un pacchetto suggerito}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Visualizzare un pacchetto suggerito}}\\ 
    \hline
    Agenti & Amico del cliente \\
    \hline
    Goal & G4\\ 
    \hline
    Condizione di ingresso & L'amico (A) ha ricevuto il codice identificativo del pacchetto dall'amico\\ 
    \hline
    Flusso degli eventi & 1) A si reca sulla pagina principale del sistema\\
    ~ & 2) A inserisce il codice del pacchetto nell'apposito campo\\
    \hline
    Condizioni di uscita & Il sistema mostra la pagina relativa al pacchetto inserito\\ \hline
	Eccezioni & Nel caso il codice del pacchetto inserito non fosse valido, il sistema mostra un messaggio di errore e A deve procedere rieseguendo il caso d'uso\\ 
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{visualizzarePacchettoSuggerito}

\paragraph{Acquistare il pacchetto suggerito}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Acquistare il pacchetto suggerito}}\\ 
    \hline
    Agenti & Amico del cliente \\
    \hline
    Goal & G4\\ 
    \hline
    Condizione di ingresso & L'amico del cliente (A) ha ricevuto il codice identificativo del pacchetto ed è entrato nella pagina del pacchetto\\ 
    \hline
    Flusso degli eventi & 1) A seleziona l'acquisto del pacchetto\\
    ~ & 2) A effettua il login\\
    ~ & 3) A inserisce i dati di pagamento all'interno del form mostrato dal sistema\\
    ~ & 4) A conferma l'acquisto del pacchetto\\
    \hline
    Condizioni di uscita & Il sistema notifica che l'acquisto è andato a buon fine e registra il pagamento\\ \hline
	Eccezioni & Nel caso in cui l'acquisto non avvenga con successo A è notificato e deve procede alla riesecuzione dello use case dal punto 1\\
	~ & Nel caso in cui al punto 2 A non sia registrato nel sistema, viene richiesta ad A la registrazione al sistema e lo use case riparte dal punto 1\\
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{acquistoPacchettoSuggerito}

\paragraph{Creare una gift list durante l'acquisto}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Creare una gift list durante l'acquisto}}\\ 
    \hline
    Agenti & Cliente \\
    \hline
    Goal & G5\\ 
    \hline
    Condizione di ingresso & Il Cliente (C) è correttamente registrato al sistema, ha effettuato l'accesso, e si trova nella pagina di acquisto del pacchetto\\ 
    \hline
    Flusso degli eventi & 1) C inserisce nella gift list i prodotti base desiderati\\
    ~ & 2) C conferma l'acquisto del pacchetto\\
    \hline
    Condizioni di uscita & Il sistema notifica C che l'operazione è andata a buon fine\\ \hline
	Eccezioni & Nel caso in cui l'acquisto non dovesse andare a buon fine il cliente viene notificato dell'errore dal sistema e lo use case riparte dal punto 1\\ 
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{creareGiftList}

\paragraph{Acquisto di un pacchetto}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Acquisto di un pacchetto}}\\ 
    \hline
    Agenti & Cliente \\
    \hline
    Goal & G2\\ 
    \hline
	Condizione di ingresso & Il cliente (C) è correttamente registrato al sistema, ha effettuato l'accesso ed ha completato la personalizzazione del pacchetto inserendo almeno la data di partenza e si trova nella pagina di visualizzazione del pacchetto\\ 
    \hline
    Flusso degli eventi & 1) C seleziona l'acquisto del pacchetto\\
    ~ & 2) C inserisce i dati di pagamento all'interno del form mostrato dal sistema\\
    ~ & 3) C conferma l'acquisto del pacchetto\\
    \hline
    Condizioni di uscita & Il sistema notifica che l'acquisto è andato a buon fine e registra il pagamento\\ \hline
	Eccezioni & Nel caso in cui l'acquisto non avvenga con successo C è notificato e deve procede alla riesecuzione dello use case dal punto 1\\
	\hline
    \end{tabular}
}

\includegraphics[height=20cm]{acquistoPacchettoViaggio}

\paragraph{Esplorare la gift list di un pacchetto ricevuto}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Esplorare la gift list di un pacchetto ricevuto}}\\ 
    \hline
    Agenti & Amico del cliente \\
    \hline
    Goal & G6\\ 
    \hline
    Condizione di ingresso & L'amico del cliente (A) ha ricevuto il codice identificativo di un pacchetto\\ 
    \hline
    Flusso degli eventi & 1) A si reca sulla pagina principale del sistema\\
    ~ & 2) A inserisce il codice del pacchetto all'interno della sezione "Mostra pacchetto suggerito"\\
    ~ & 3) Il sistema visualizza il contenuto del pacchetto\\
    ~ & 4) A seleziona "Mostra gift list"\\
    \hline
    Condizioni di uscita & Il sistema mostra la gift list associata al pacchetto selezionato\\ \hline
	Eccezioni & Nessuna eccezione\\ 
	\hline
    \end{tabular}
}

\includegraphics[width=13cm]{esplorareGiftList}

\paragraph{Acquistare prodotti all'interno di una gift list}\mbox{}\\
{
	\renewcommand{\arraystretch}{1.5}
	\renewcommand{\tabcolsep}{0.2cm}
    \begin{tabular}{|c|p{8.85cm}|}
    \hline
    \multicolumn{2}{|c|}{\cellcolor{SkyBlue}\textbf{Acquistare prodotti all'interno di una gift list}}\\ 
    \hline
    Agenti & Amico del Cliente \\
    \hline
    Goal & G6\\ 
    \hline
    Condizione di ingresso & L'amico del cliente (A) ha ricevuto il codice identificativo di un pacchetto\\ 
    \hline
    Flusso degli eventi & 1) A visualizza la gift list associata al pacchetto\\
    ~ & 2) A seleziona i prodotti della gift list che vuole acquistare\\
    ~ & 3) A seleziona '"Acquista'" ed effettua il login come cliente\\
    ~ & 4) A seleziona i pacchetti che vuole regalare all'amico\\	
    ~ & 5) A finalizza l'acquisto dei prodotti\\
    \hline
    Condizioni di uscita & Il sistema registra l'acquisto dei prodotti e li rimuove dalla gift list, notificando infine il cliente\\ \hline
	Eccezioni & Nel caso in cui l'amico del cliente non sia già registrato come cliente, dovrà procedere con la registrazione. Nel caso in cui la gift list non sia presente il sistema notifica la mancanza al cliente.\\ 
	\hline
    \end{tabular}
}

\includegraphics[height=19cm]{acquistoProdottoDaGL}
\begin{landscape}
\subsubsection{Class Diagram}
\includegraphics[height=12.8cm]{ClassDiagram}
\end{landscape}
\subsubsection{Statechart}
\includegraphics[width=13.7cm]{StateCharts}\\\\
Gli statechart presentati mostrano il cambiamento di stato di un utente non registrato e di un prodotto che viene acquistato dalla gift list.

\paragraph{Registrazione dell'utente}
L'utente è inizialmente non registrato. Una volta che effettua la registrazione, se i dati inseriti sono corretti e consistenti, diventa un utente registrato. \\
Nel caso in cui i dati inseriti non dovessero essere validi, l'utente rimane un utente non registrato e dovrà nuovamente effettuare la registrazione.

\paragraph{Gestione della gift list}
Il prodotto è inizialmente inserito nella gift list. Una volta che viene acquistato, viene rimosso e diventa di fatto un prodotto acquistato. Se non viene acquistato, nel momento in cui la data attuale supera la data di partenza del pacchetto, ovvero nel momento in cui il prodotto diventa inutilizzabile, viene rimosso dalla gift list senza diventare un prodotto acquistato.
\\
\newpage
\subsection{Requisiti non funzionali}
\subsubsection{Requisiti prestazionali}
Il sistema non dovrà sottostare a particolari requisiti prestazionali.
\subsubsection{Requisiti di sicurezza}
Ogni utente registrato deve fornire al momento della registrazione uno username ed una password che lo identificheranno all'interno del sistema. Ogni username è univoco e la password dovrà rispettare i seguenti vincoli:
\begin{itemize}
\item Essere lunga da 8 a 32 caratteri
\item Contenere almeno una lettera
\item Contenere almeno un carattere numerico
\end{itemize}
I clienti devono essere in grado di visualizzare i pacchetti preconfigurati solo una volta che avranno effettuato l'autenticazione all'interno del sistema, salvo nel caso in cui inseriscano l'identificativo di un pacchetto acquistato ricevuto da un utente già registrato. In questo secondo caso possono visionare solo il pacchetto che hanno ricevuto senza alcuna possibilità di modifica. Nel caso in cui decidano di procedere con l'acquisto, dovranno procedere con la registrazione o con l'autenticazione.

I pacchetti preconfigurati possono essere inseriti all'interno del sistema solo dagli impiegati e solo in seguito alla loro autenticazione.
\subsubsection{Requisiti legati alla base di dati}
La base dati sarà progettata al fine di memorizzare tutte le informazioni rilevanti per il sistema identificate nel dettaglio nel diagramma delle classi presente in questo documento.
\subsubsection{Vincoli generali di progetto}
Il sistema software sarà progetto e poi implementato seguendo le caratteristiche della piattaforma Java Enterprise Edition (JEE).
\newpage
\subsubsection{Attributi del sistema}
\paragraph{Affidabilità}\mbox{}\\
Al fine di assicurare la coerenza dei dati e il recupero di essi in caso di eventi accidentali sono previsti dei backup completi intervallati da backup incrementali a cadenza periodica. 

Le copie di backup saranno conservate in una struttura differente da quella in cui sarà ubicato il sistema finale, in modo da poter garantire il recupero dei dati anche in caso di eventi accidentali che coinvolgano la struttura stessa.
\paragraph{Accessibilità}\mbox{}\\
Il software TravelDream, basandosi su una piattaforma web, sarà accessibile senza alcuna limitazione di territorialità.\\
Per quanto riguarda l'accesso di utenti diversamente abili, sarà garantito l'utilizzo del software agli utenti non udenti.
\paragraph{Sicurezza}\mbox{}\\
Le password degli utenti non dovranno essere salvate in chiaro sul database ma dovranno essere criptate per la sicurezza dell'utente, in modo che nemmeno l'amministratore di sistema abbia accesso alle credenziali.
\paragraph{Portabilità}\mbox{}\\
Trattandosi di una soluzione di e-commerce basata su web e J2EE, il sistema sarà fruibile da qualsiasi dispositivo equipaggiato con un comune web browser compatibile con Javascript.
\subsubsection{Altri requisiti}
\paragraph{Scalabilità del sistema}\mbox{}\\
Il sistema prevede l'utilizzo di un application server inizialmente installato sulla stessa macchina sul quale sarà installato il database server. Ciò non limita comunque la scalabilità del sistema in quanto in caso di necessità di servire più utenti contemporaneamente sarà sufficiente trasferire l'application server su una macchina differente ed eventualmente aggiungere in parallelo più sottosistemi controllati da un sistema di distribuzione del carico.
\paragraph{Gestione degli errori}\mbox{}\\
Il sistema attuerà tutte le misure necessarie a mantenere la coerenza dei dati salvati all'interno del sistema prevenendo l'inserimento di dati non corretti o il completamento di form con dati obbligatori mancanti.
\paragraph{Estensibilità del sistema}\mbox{}\\
È previsto in aggiornamenti futuri l'inserimento di altre tipologie di prodotti base, quali altri mezzi di trasporto, altre attività, ecc. Il sistema deve quindi essere estensibile in modo tale da non richiedere modifiche sostanziali per l'aggiunta di tali prodotti.
\newpage
\section{Appendice}
\subsection{Modellazione Alloy}
\subsubsection{Introduzione}
La presente sezione illustra la modellazione del diagramma delle classi, presentato in precedenza, utilizzando il linguaggio Alloy. Tale linguaggio consente di verificare la consistenza del diagramma delle classi prodotto, ricorrendo ad una rappresentazione formale delle singole entità e delle rispettive relazioni. In particolare permette di stabilire la consistenza di tutte le assunzioni fatte andando a verificare alcune asserzioni e cercando di generare delle istanze di "mondi" che le rispettino. L'analizzatore utilizzato, nel generare i "mondi", va a creare delle istanze all'interno di un dominio limitato e specificato; tali risultati, quindi, garantiscono la consistenza della modellazione realizzata per la fascia di dominio scelta e sono indizio di una sua probabile correttezza anche sull'intero dominio.
\subsubsection{Definizione dati primitivi e entità}
\textbf{Tipi primitivi}\\
Sono stati definiti alcuni tipi primitivi a supporto delle entità, in particolare Intero e Stringa, che rappresentano rispettivamente un numero intero ed una stringa, ed un tipo primitivo Citta, che rappresenta una Città.
\begin{figure}[H]
\includegraphics{tipiDiDato}
\end{figure}
Le seguenti entità rappresentano date, pacchetti preconfigurati dall'impiegato, pacchetti acquistati dai clienti e prodotti base, con le rispettive proprietà che devono rispettare.

Allo scopo di semplificare la modellazione dei vincoli, è stato introdotto un attributo "timestamp" presente all'interno dell'entità Data. Esso è un intero che rappresenta la data in un formato standard, in modo tale che il confronto fra date sia realizzabile semplicemente con un test di maggioranza sul timestamp. Tale formato è definito come il numero di giorni passati dal giorno 1/1/2000, che rappresenta il timestamp 0. Il timestamp è un dato calcolato automaticamente dal sistema.
\begin{figure}[H]
\includegraphics{entitaData}
\end{figure}
\begin{figure}[H]
\includegraphics{entitaPacchettoPreconfigurato}
\end{figure}
\begin{figure}[H]
\includegraphics{entitaPacchettoAcquistato}
\end{figure}
\begin{figure}[H]
\includegraphics{entitaProdottoBase}
\end{figure}
Le seguenti entità, infine, rappresentano gli utenti registrati al sistema, nonché i pagamenti che saranno registrati all'interno dello stesso
\begin{figure}[H]
\includegraphics{entitaUtenteRegistratoEPagamento}
\end{figure}
\subsubsection{Definizione fatti e asserzioni}
Di seguito sono mostrate le asserzioni utilizzate per verificare la consistenza del sistema e i fatti che tutte le istanze dei mondi dovranno rispettare.\\
Per la scrittura di fatti e asserzioni sono state inizialmente inserite le asserzioni sulla realtà in analisi insieme ad una prima serie di fatti che i mondi devono rispettare. Di volta in volta che venivano trovati controesempi alle asserzioni, si ricercava le cause nei fatti scritti, andando quindi a correggere eventuali errori in questi ultimi.\\
\begin{figure}[H]
\includegraphics[width=15cm]{fatti}
\end{figure}
\begin{figure}[H]
\includegraphics{asserzioni}
\end{figure}
L'analizzatore di alloy è stato utilizzato per verificare la validità delle asserzioni effettuate rispetto ai mondi generati. È da sottolineare il fatto che l'analizzatore di alloy ricerchi controesempi alle asserzioni effettuate e che la mancanza degli stessi non implica il fatto che l'asserzione sia sicuramente valida, ma che potrebbe esserlo.\\

Di seguito, viene visualizzato il risultato dell'analizzatore di alloy per quanto riguarda le asserzioni. Nessun controesempio è stato trovato, di conseguenza le asserzioni effettuate potrebbero essere valide.
\begin{figure}[H]
\includegraphics{alloyRunCheck}
\end{figure}
\newpage
\subsubsection{Definizione predicati}
Di seguito sono riportati i predicati ritenuti significanti per quanto riguarda la modellazione.
\begin{itemize}
\item Predicato AcquistoDiUnPacchetto: Modella l'acquisto di un pacchetto.
\item Predicato AcquistoAttivitaPacchettoGiaComprato: Modella l'acquisto di un'attività da una gift list di un pacchetto già acquistato. Il prodotto viene rimosso dalla gift list ed inserito all'interno delle attività acquistate.
\item Predicato AggiuntaAttivitaGiftListPacchettoGiaComprato: Modella l'inserimento di un'attività all'interno della gift list di un pacchetto già acquistato. L'attività viene inserita all'interno della gift list del pacchetto.
\item Predicato AcquistoPacchettoSuggeritoDaAmico:
Modella l'acquisto di un pacchetto da parte di un amico di un cliente, a cui è stato suggerito un pacchetto acquistato dal cliente stesso.
\end{itemize}
Tutti i predicati di creazione ed inserimento di PP o PB nel sistema non sono stati modellati, in quanto non significativi dal punto di vista della specifica.
Difatti, un PP inserito nel sistema deve necessariamente essere un PP ben formato, o si violerebbero le specifiche globali del sistema, rappresentate dai fatti. Lo stesso vale per i PB.

Inoltre il mondo generato dal predicato di acquisto di un pacchetto è identico al mondo rappresentante un PA ben formato, in quanto l'acquisto rappresenta in effetti la creazione ed inserimento nel sistema di un PA ben formato, dato uno specifico PP originante, che è scelto dal cliente. Il diagramma è quindi riportato una sola volta per entrambi i casi.
\begin{figure}[H]
\includegraphics{predicati}
\end{figure}
\begin{figure}[H]
\includegraphics{predicati2}
\end{figure}
Viene di seguito riportato il risultato fornito dall'analizzatore di Alloy, che dimostra come i predicati siano consistenti.
\begin{figure}[H]
\includegraphics[width=13.7cm]{alloyRunPred}
\end{figure}
\newpage
\subsubsection{Mondi generati}
Il presente paragrafo mostra una serie di istanze di "mondi" generati attraverso l'analizzatore del linguaggio Alloy al fine di evidenziare visivamente gli effetti dei vincoli e delle assunzioni modellate formalmente.
Sono anche presenti alcune istanze di predicati che mostrano come tali predicati possano effettivamente essere soddisfatti.
\paragraph{Mondo completo}\mbox{}\\
Il primo mondo mostrato è stato generato dal predicato \textbf{show}, ed è quindi una rappresentazione di un possibile mondo completo.
\begin{figure}[H]
\includegraphics[width=14cm]{mondocompleto} 
\end{figure}
\newpage
\paragraph{Pacchetto preconfigurato}\mbox{}\\
Il secondo mondo mostra nel dettaglio un'istanza di un pacchetto preconfigurato, con tutte le sue componenti principali.
In esso si possono anche notare altre istanze di entità che non essendo compatibili col pacchetto, non risultano inserite all'interno di esso.
\begin{figure}[H]
\includegraphics[width=14cm]{PacchettoPreconfiguratoBenFormato}
\end{figure}
\paragraph{Pacchetto acquistato}\mbox{}\\
Il terzo mondo mostra un esempio di pacchetto acquistato ben formato, con tutte le entità che lo caratterizzano. In esso è anche presente un'entità semplificata di pacchetto preconfigurato, da cui il P.A. deriva.

\begin{figure}[H]
\includegraphics[width=14cm]{PacchettoAcquistatoBenFormato}
\end{figure}
\paragraph{Acquisto di attività in pacchetto già acquistato}\mbox{}\\
Il quarto mondo mostra un esempio di possibile risultato del predicato che modella l'acquisto di un'attività all'interno di un pacchetto già precedentemente acquistato, a dimostrazione del fatto che tale azione è possibile.

\begin{figure}[H]
\includegraphics[width=14cm]{PredicatoAcquistoAttivitaPacchettoGiaComprato}
\end{figure}
\newpage
\paragraph{Aggiunta di attività a gift list di pacchetto già acquistato}\mbox{}\\
Il quinto mondo mostra un possibile risultato del predicato di aggiunta di un'attività alla gift list di un pacchetto già precedentemente acquistato, a dimostrazione del fatto che tale azione è possibile.

\begin{figure}[H]
\includegraphics[width=14cm]{PredicatoAggiuntaAttivitaGiftList}
\end{figure}
\subsection{Strumenti utilizzati}
Per la realizzazione di questo documento sono stati utilizzati i seguenti strumenti:
\begin{itemize}
\item TexStudio, per la realizzazione del documento e per la creazione del file PDF
\item TortoiseSVN per la sincronizzazione tra i componenti del gruppo e per il controllo versione
\item Microsoft Visual Studio 2013, per la realizzazione dei sequence diagram
\item Microsoft Visio 2013, per la realizzazione degli state charts, del class diagram e dello use case diagram
\item Alloy Analizer 4.2, per la modellizazione dei mondi e per la loro analisi
\end{itemize}
\end{document}